// 一定要有自己根据需要实现的模块去编程的能力，利用计算机的资源

#pragma once
#include <iostream>
#include <unordered_map>
#include <functional>

void MySQL()
{
    std::cout << "我执行了一个MySQL方法" << std::endl;
}

void Add()
{
    std::cout << "我执行了一个Add方法" << std::endl;
}

void Boost_Searcher()
{
    std::cout << "我执行了一个Boost_Searcher方法" << std::endl;
}

using func_t = std::function<void()>;
// using work_t = std::function<void(std::string)>;

namespace ns_TaskManger
{
    class TaskManger
    {
    public:
        TaskManger()
        {
            func_map[0] = MySQL;
            func_map[1] = Add;
            func_map[2] = Boost_Searcher;
        }
        ~TaskManger()
        {
        }

        // 交给每个子进程去执行的方法
        void Worker(std::string &str)
        {
            while (true)
            {
                int index;
                size_t n = ::read(0, &index, sizeof(index));

                if (n <= 0) // 如果读取到 EOF 或出错，退出
                {
                    std::cout << "子进程读取到 EOF 或出错，退出" << std::endl;
                    return;
                }

                if (index == -1) // 如果读取到退出信号，退出
                {
                    std::cout << "子进程收到退出信号，退出" << std::endl;
                    return;
                }

                if (index >= func_map.size())
                {
                    std::cout << "子进程收到无效任务编号，退出" << std::endl;
                    return;
                }

                func_t func = func_map[index];
                std::cout << "我对应的管道是: " << str.c_str() << "我执行方法啦！" << std::endl;
                func();
            }
        }

        /*func_t GetWork(int index)
        {
            if (index < func_map.size())
            {
                return func_map[index];
            }
            return func_map[0]; // 打印一句index越界
        }*/
        std::unordered_map<int, func_t> &GetMap()
        {
            return func_map;
        }

    private:
        std::unordered_map<int, func_t> func_map;
    };
}